//----------------------------------------------------------------------------
//  XC program; finite element analysis code
//  for structural analysis and design.
//
//  Copyright (C)  Luis Claudio Pérez Tato
//
//  This program derives from OpenSees <http://opensees.berkeley.edu>
//  developed by the  «Pacific earthquake engineering research center».
//
//  Except for the restrictions that may arise from the copyright
//  of the original program (see copyright_opensees.txt)
//  XC is free software: you can redistribute it and/or modify
//  it under the terms of the GNU General Public License as published by
//  the Free Software Foundation, either version 3 of the License, or 
//  (at your option) any later version.
//
//  This software is distributed in the hope that it will be useful, but 
//  WITHOUT ANY WARRANTY; without even the implied warranty of
//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
//  GNU General Public License for more details. 
//
//
// You should have received a copy of the GNU General Public License 
// along with this program.
// If not, see <http://www.gnu.org/licenses/>.
//----------------------------------------------------------------------------
//ShellBData.h,v $

#ifndef ShellBData_h
#define ShellBData_h

#include <cstdlib>
#include <vector>

namespace XC {

class Matrix;

//! @ingroup PlaneElements
//
//! @brief Auxiliary data for shell elements.
class ShellBData
  {
  private: 

    //B-bar data
    std::vector<Matrix> GammaB1pointer;
    std::vector<Matrix> GammaD1pointer;
    std::vector<Matrix> GammaA2pointer;
    std::vector<Matrix> GammaC2pointer;

    //Bhat data
    std::vector<Matrix> Bhat;


    void shear_matrix_ptrs_setup(void);
    void bhat_setup(void);
  public:
    ShellBData(void);

    const Matrix &getGammaB1(const size_t &node) const;
    Matrix &getGammaB1(const size_t &node);
    const Matrix &getGammaD1(const size_t &node) const;
    Matrix &getGammaD1(const size_t &node);
    const Matrix &getGammaA2(const size_t &node) const;
    Matrix &getGammaA2(const size_t &node);
    const Matrix &getGammaC2(const size_t &node) const;
    Matrix &getGammaC2(const size_t &node);
    const Matrix &getBhat(const size_t &j) const;
    Matrix &getBhat(const size_t &j);

    void ZeroBHat(void);
    void DivideBHat(const double &);
    const Matrix &computeBshear(const size_t &,const double shp[3][4] ) const;
    const Matrix &computeBbarShear(const size_t &,const double &,const double &,const Matrix &) const;
    void computeB(const double shp[3][4],const double &,const double &,const Matrix &,const double &);
  }; 

} // end of XC namespace
#endif
